package com.ferryc.commons.service;

import java.io.Serializable;
import java.util.List;

import org.springframework.transaction.annotation.Transactional;

import com.ferryc.commons.entity.BaseEntity;
import com.ferryc.commons.mapper.CommonMapper;
import com.ferryc.commons.web.PageResonse;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

@Transactional(readOnly = true)
public class CommonService<T> extends BaseService {
	/** 默认的Mapper映射 */
	protected CommonMapper<T> mapper;

	/**
	 * 初始化方法, 将子类的mapper赋值给当前对象的mapper
	 */
	protected void init() {
	}

	/**
	 * 获取数据列表(不分页)
	 * 
	 * @return 数据列表
	 */
	public List<T> list() {
		if (this.mapper == null) {
			init();
		}
		return mapper.list();
	}

	/**
	 * 列出所有数据列表(不分页)
	 * 
	 * @param entity
	 *            查询条件
	 * @return 所有数据列表
	 */
	public List<T> listByEntity(T entity) {
		if (this.mapper == null) {
			init();
		}
		return mapper.listByEntity(entity);
	}

	/**
	 * 获取数据总数
	 * 
	 * @return 数据总数
	 */
	public Integer count() {
		if (this.mapper == null) {
			init();
		}
		return mapper.count();
	}

	/**
	 * 根据entity获取数据总数
	 * 
	 * @param entity
	 *            查询条件
	 * @return 数据总数
	 */
	public Integer countByEntity(T entity) {
		if (this.mapper == null) {
			init();
		}
		return mapper.countByEntity(entity);
	}

	/**
	 * 根据编号获取数据
	 * 
	 * @param id
	 *            数据编号
	 * @return 数据详情
	 */
	public T get(Serializable id) {
		if (this.mapper == null) {
			init();
		}
		return mapper.get(id);
	}

	/**
	 * 根据数据对象的属性获取指定数据
	 * 
	 * @param entity
	 *            对象形式的参数
	 * @return 指定数据
	 */
	public T getByEntity(T entity) {
		if (this.mapper == null) {
			init();
		}
		return mapper.getByEntity(entity);
	}

	/**
	 * 分页查询
	 * 
	 * @param entity
	 *            对象形式的参数
	 * @return 分页数据
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public PageResonse<T> selectPage(T entity) {
		if (this.mapper == null) {
			init();
		}
		PageHelper.startPage(((BaseEntity) entity).getPageNum(), ((BaseEntity) entity).getPageSize());
		List<T> list = mapper.listByEntity(entity);
		PageInfo pageInfo = new PageInfo(list);

		PageResonse<T> pageResonse = new PageResonse();
		pageResonse.setTotal(pageInfo.getTotal());
		pageResonse.setRows(pageInfo.getList());
		return pageResonse;
	}

	/**
	 * 保存指定数据到数据库
	 * 
	 * @param entity
	 *            待保存数据
	 */
	@Transactional(readOnly = false)
	public void insert(T entity) {
		if (this.mapper == null) {
			init();
		}
		mapper.insert(entity);
	}

	/**
	 * 批量保存数据
	 * 
	 * @param entitys
	 *            待保存的批量数据
	 */
	@Transactional(readOnly = false)
	public void insertAll(List<T> entitys) {
		if (this.mapper == null) {
			init();
		}
		mapper.insertAll(entitys);
	}

	/**
	 * 更新指定数据
	 * 
	 * @param entity
	 *            待更新数据
	 */
	@Transactional(readOnly = false)
	public void update(T entity) {
		if (this.mapper == null) {
			init();
		}
		mapper.update(entity);
	}

	/**
	 * 批量更新数据
	 * 
	 * @param entitys
	 *            待更新的批量数据
	 */
	@Transactional(readOnly = false)
	public void updateAll(List<T> entitys) {
		if (this.mapper == null) {
			init();
		}
		mapper.updateAll(entitys);
	}

	/**
	 * 根据ID删除指定数据
	 * 
	 * @param id
	 *            待删除的ID
	 */
	@Transactional(readOnly = false)
	public void remove(Serializable id) {
		if (this.mapper == null) {
			init();
		}
		mapper.remove(id);
	}

	/**
	 * 根据ID删除指定数据
	 * 
	 * @param entity
	 *            待删除的对象(包含删除的条件)
	 */
	@Transactional(readOnly = false)
	public void removeByEntity(T entity) {
		if (this.mapper == null) {
			init();
		}
		mapper.removeByEntity(entity);
	}

	/**
	 * 通过ID集合批量删除数据
	 * 
	 * @param ids
	 *            待删除的数据ID集合
	 */
	@Transactional(readOnly = false)
	public void removeAll(List<Integer> ids) {
		if (this.mapper == null) {
			init();
		}
		mapper.removeAll(ids);
	}

	/**
	 * 批量删除数据
	 * 
	 * @param entitys
	 *            待删除的批量数据
	 */
	@Transactional(readOnly = false)
	public void removeAllByEntity(List<T> entitys) {
		if (this.mapper == null) {
			init();
		}
		mapper.removeAllByEntity(entitys);
	}
}
